package cn.leaf.calculator.datasource;

import cn.leaf.calculator.bean.CalUnitBeanDefinition;
import org.springframework.core.convert.converter.Converter;

import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;

/**
 * 计算单元数据源
 * <p> 负责管理和转换{@link CalUnitBeanDefinition} 的定义，分析</p>
 *
 * @author 李克国
 * @version 1.0.0

 */
public interface CalUnitDataSource<T> extends Iterator<CalUnitBeanDefinition<T>> {

    /**
     * 获取计算单元源信息
     *
     * @return 计算单元源信息
     */
    Collection<CalUnitBeanDefinition<T>> getCalUnitBeans();

    /**
     * 设置计算单元源信息
     *
     * @param values 需要计算的 实体
     */
    void setValues(Collection<T> values);

    /**
     * 获取计算 value
     *
     * @return value
     */
    Collection<T> getValues();

    /**
     * 初始化
     */
    void initialize();

    /**
     * 刷新，回到最初始化的状态，，该操作会清空现有管理的{@link CalUnitBeanDefinition},根据原有的计算项重新分析和出初始化
     */
    void refresh();

    /**
     * 清除计算项，清除该数据源管理的所有数据，包含参数池中的数据
     */
    void clear();

    /**
     * 添加一个计算项
     *
     * @param element 计算单元
     */
    void add(T element);

    /**
     * 删除一个计算项
     *
     * @param id id
     */
    void remove(Serializable id);

    /**
     * 设置类型转换器
     *
     * @param converter 类型转换器
     */
    void setConverter(Converter<T, ? extends CalUnitBeanDefinition<T>> converter);
}
